home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / ip / trace / tcpdump-2.2.1 / print-domain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-25  |  6.9 KB  |  288 lines

  1. /*
  2.  * Copyright (c) 1988-1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  */
  21.  
  22. #ifndef lint
  23. static char rcsid[] =
  24.     "@(#) $Header: print-domain.c,v 1.16 92/05/25 14:28:59 mccanne Exp $ (LBL)";
  25. #endif
  26.  
  27. #include <sys/param.h>
  28. #include <sys/types.h>
  29. #include <sys/socket.h>
  30. #include <net/if.h>
  31. #include <netinet/in.h>
  32. #include <netinet/if_ether.h>
  33. #include <netinet/in_systm.h>
  34. #include <netinet/ip.h>
  35. #include <netinet/ip_var.h>
  36. #include <netinet/udp.h>
  37. #include <netinet/udp_var.h>
  38. #include <netinet/tcp.h>
  39. #include <netinet/tcpip.h>
  40. #include <arpa/nameser.h>
  41.  
  42. #include "interface.h"
  43. #include "addrtoname.h"
  44.  
  45. static char *ns_ops[] = {
  46.     "", " inv_q", " stat", " op3", " op4", " op5", " op6", " op7",
  47.     " op8", " updataA", " updateD", " updateDA",
  48.     " updateM", " updateMA", " zoneInit", " zoneRef",
  49. };
  50.  
  51. static char *ns_resp[] = {
  52.     "", " FormErr", " ServFail", " NXDomain",
  53.     " NotImp", " Refused", " Resp6", " Resp7",
  54.     " Resp8", " Resp9", " Resp10", " Resp11",
  55.     " Resp12", " Resp13", " Resp14", " NoChange",
  56. };
  57.  
  58.  
  59. /* skip over a domain name */
  60. static u_char *
  61. ns_nskip(cp)
  62.     register u_char *cp;
  63. {
  64.     register u_char i;
  65.  
  66.     if (((i = *cp++) & 0xc0) == 0xc0)
  67.         return (cp + 1);
  68.     while (i) {
  69.         cp += i;
  70.         i = *cp++;
  71.     }
  72.     return (cp);
  73. }
  74.  
  75. /* print a domain name */
  76. static void
  77. ns_nprint(cp, bp, ep)
  78.     register u_char *cp;
  79.     register u_char *bp;
  80.     register u_char *ep;
  81. {
  82.     register u_int i;
  83.  
  84.     putchar(' ');
  85.     if (i = *cp++)
  86.         while (i && cp < ep) {
  87.             if ((i & 0xc0) == 0xc0) {
  88.                 cp = bp + (((i << 8) | *cp) & 0x3fff);
  89.                 i = *cp++;
  90.                 continue;
  91.             }
  92.             do {
  93.                 putchar(*cp++);
  94.             } while (--i);
  95.             putchar('.');
  96.             i = *cp++;
  97.         }
  98.     else
  99.         putchar('.');
  100. }
  101.  
  102.  
  103. /* print a query */
  104. static void
  105. ns_qprint(cp, bp, ep)
  106.     register u_char *cp;
  107.     register u_char *bp;
  108.     register u_char *ep;
  109. {
  110.     u_char *np = cp;
  111.     register u_int i;
  112.  
  113.     cp = ns_nskip(cp);
  114.  
  115.     if (cp + 4 > ep)
  116.         return;
  117.  
  118.     /* print the qtype and qclass (if it's not IN) */
  119.     i = *cp++ << 8;
  120.     switch (i |= *cp++) {
  121.     case T_A:    printf(" A"); break;
  122.     case T_NS:    printf(" NS"); break;
  123.     case T_MD:    printf(" MD"); break;
  124.     case T_MF:    printf(" MF"); break;
  125.     case T_CNAME:    printf(" CNAME"); break;
  126.     case T_SOA:    printf(" SOA"); break;
  127.     case T_MB:    printf(" MB"); break;
  128.     case T_MG:    printf(" MG"); break;
  129.     case T_MR:    printf(" MR"); break;
  130.     case T_NULL:    printf(" NULL"); break;
  131.     case T_WKS:    printf(" WKS"); break;
  132.     case T_PTR:    printf(" PTR"); break;
  133.     case T_HINFO:    printf(" HINFO"); break;
  134.     case T_MINFO:    printf(" MINFO"); break;
  135.     case T_MX:    printf(" MX"); break;
  136.     case T_UINFO:    printf(" UINFO"); break;
  137.     case T_UID:    printf(" UID"); break;
  138.     case T_GID:    printf(" GID"); break;
  139. #ifdef T_UNSPEC
  140.     case T_UNSPEC:    printf(" UNSPEC"); break;
  141. #endif
  142.     case T_AXFR:    printf(" AXFR"); break;
  143.     case T_MAILB:    printf(" MAILB"); break;
  144.     case T_MAILA:    printf(" MAILA"); break;
  145.     case T_ANY:    printf(" ANY"); break;
  146.     default:    printf(" Type%d", i); break;
  147.     }
  148.     i = *cp++ << 8;
  149.     if ((i |= *cp++) != C_IN)
  150.         if (i == C_ANY)
  151.             printf("(c_any)");
  152.         else
  153.             printf("(Class %d)", i);
  154.  
  155.     putchar('?');
  156.     ns_nprint(np, bp, ep);
  157. }
  158.  
  159.  
  160. /* print a reply */
  161. static void
  162. ns_rprint(cp, bp, ep)
  163.     register u_char *cp;
  164.     register u_char *bp;
  165.     register u_char *ep;
  166. {
  167.     register u_int i;
  168.     u_short typ;
  169.  
  170.     cp = ns_nskip(cp);
  171.  
  172.     if (cp + 10 > ep)
  173.         return;
  174.  
  175.     /* print the type/qtype and class (if it's not IN) */
  176.     typ = *cp++ << 8;
  177.     typ |= *cp++;
  178.     i = *cp++ << 8;
  179.     if ((i |= *cp++) != C_IN)
  180.         if (i == C_ANY)
  181.             printf("(c_any)");
  182.         else
  183.             printf("(Class %d)", i);
  184.  
  185.     /* ignore ttl & len */
  186.     cp += 6;
  187.     switch (typ) {
  188.     case T_A:    printf(" A %s", ipaddr_string(cp)); break;
  189.     case T_NS:    printf(" NS"); ns_nprint(cp, bp, ep); break;
  190.     case T_MD:    printf(" MD"); break;
  191.     case T_MF:    printf(" MF"); break;
  192.     case T_CNAME:    printf(" CNAME"); ns_nprint(cp, bp, ep); break;
  193.     case T_SOA:    printf(" SOA"); break;
  194.     case T_MB:    printf(" MB"); break;
  195.     case T_MG:    printf(" MG"); break;
  196.     case T_MR:    printf(" MR"); break;
  197.     case T_NULL:    printf(" NULL"); break;
  198.     case T_WKS:    printf(" WKS"); break;
  199.     case T_PTR:    printf(" PTR"); ns_nprint(cp, bp, ep); break;
  200.     case T_HINFO:    printf(" HINFO"); break;
  201.     case T_MINFO:    printf(" MINFO"); break;
  202.     case T_MX:    printf(" MX"); ns_nprint(cp+2, bp, ep);
  203. #ifndef TCPDUMP_ALIGN
  204.             printf(" %d", *(short *)cp);
  205. #else
  206.             {
  207.                 u_short x = *cp | cp[1] << 8; 
  208.                 printf(" %d", ntohs(x));
  209.             }
  210. #endif
  211.             break;
  212.     case T_UINFO:    printf(" UINFO"); break;
  213.     case T_UID:    printf(" UID"); break;
  214.     case T_GID:    printf(" GID"); break;
  215. #ifdef T_UNSPEC
  216.     case T_UNSPEC:    printf(" UNSPEC"); break;
  217. #endif
  218.     case T_AXFR:    printf(" AXFR"); break;
  219.     case T_MAILB:    printf(" MAILB"); break;
  220.     case T_MAILA:    printf(" MAILA"); break;
  221.     case T_ANY:    printf(" ANY"); break;
  222.     default:    printf(" Type%d", typ); break;
  223.     }
  224. }
  225.  
  226. void
  227. ns_print(np, length)
  228.     register HEADER *np;
  229.     int length;
  230. {
  231.     u_char *ep = (u_char *)snapend;
  232.  
  233.     /* get the byte-order right */
  234.     NTOHS(np->id);
  235.     NTOHS(np->qdcount);
  236.     NTOHS(np->ancount);
  237.     NTOHS(np->nscount);
  238.     NTOHS(np->arcount);
  239.  
  240.     if (np->qr) {
  241.         /* this is a response */
  242.         printf(" %d%s%s%s%s%s",
  243.             np->id,
  244.             ns_ops[np->opcode],
  245.             ns_resp[np->rcode],
  246.             np->aa? "*" : "",
  247.             np->ra? "" : "-",
  248.             np->tc? "|" : "");
  249.         if (np->qdcount != 1)
  250.             printf(" [%dq]", np->qdcount);
  251.         printf(" %d/%d/%d", np->ancount, np->nscount, np->arcount);
  252.         if (np->ancount)
  253.             ns_rprint(ns_nskip((u_char *)(np + 1)) + 4,
  254.                   (u_char *)np, ep);
  255.     }
  256.     else {
  257.         /* this is a request */
  258.         printf(" %d%s%s",
  259.             np->id,
  260.             ns_ops[np->opcode],
  261.             np->rd? "+" : "");
  262.  
  263.         /* any weirdness? */
  264.          if (*(((u_short *)np)+1) & htons(0x6ff))
  265.              printf(" [b2&3=0x%x]", ntohs(*(((u_short *)np)+1)));
  266.  
  267.         if (np->opcode == IQUERY) {
  268.             if (np->qdcount)
  269.                 printf(" [%dq]", np->qdcount);
  270.             if (np->ancount != 1)
  271.                 printf(" [%da]", np->ancount);
  272.         }
  273.         else {
  274.             if (np->ancount)
  275.                 printf(" [%da]", np->ancount);
  276.             if (np->qdcount != 1)
  277.                 printf(" [%dq]", np->qdcount);
  278.         }
  279.         if (np->nscount)
  280.             printf(" [%dn]", np->nscount);
  281.         if (np->arcount)
  282.             printf(" [%dau]", np->arcount);
  283.  
  284.         ns_qprint((u_char *)(np + 1), (u_char *)np, ep);
  285.     }
  286.     printf(" (%d)", length);
  287. }
  288.